package com.gjs.management.service.Impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gjs.common.enums.entity.ConfigTypeEnum;
import com.gjs.common.exception.BizException;
import com.gjs.management.mapper.ConfigMapper;
import com.gjs.management.pojo.dto.config.ConfigDTO;
import com.gjs.management.pojo.dto.config.ConfigQueryDTO;
import com.gjs.management.pojo.entity.Config;
import com.gjs.management.service.IConfigService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements IConfigService {

    @Override
    public List<ConfigDTO> list(ConfigTypeEnum configTypeEnum) {
        ConfigQueryDTO configQueryDTO = new ConfigQueryDTO();
        configQueryDTO.setConfigType(configTypeEnum);
        return this.list(this.buildWrapper(configQueryDTO))
                .stream()
                .map(row -> BeanUtil.copyProperties(row, ConfigDTO.class))
                .collect(Collectors.toList());
    }

    @Override
    public Boolean save(List<ConfigDTO> configDTOList, ConfigTypeEnum configTypeEnum) {
        // 判断传入的DTO List中是否存在重复
        List<String> configKeyList = configDTOList.stream().map(ConfigDTO::getConfigKey).collect(Collectors.toList());
        long count = configKeyList.stream().distinct().count();
        if (configKeyList.size() != count) {
            throw new BizException("配置关键字存在重复，请检查");
        }

        // 获取已存在的配置
        LambdaQueryWrapper<Config> configLambdaQueryWrapper = new LambdaQueryWrapper<>();
        configLambdaQueryWrapper.eq(Config::getConfigType, configTypeEnum);
        configLambdaQueryWrapper.in(Config::getConfigKey, configKeyList);
        List<Config> configList = this.list(configLambdaQueryWrapper);
        // 把List转换为Map
        Map<String, Config> configMap = configList.stream().collect(Collectors.toMap(Config::getConfigKey, row -> row));

        // 遍历传入的configDTOList
        for (ConfigDTO configDTO : configDTOList) {
            Config oldConfig = configMap.get(configDTO.getConfigKey());
            // 如果原配置关键字已存在，则只更新配置值，否则执行新增操作
            if (oldConfig != null) {
                oldConfig.setConfigValue(configDTO.getConfigValue());
                boolean res = this.updateById(oldConfig);
                if (!res) {
                    throw new BizException(StrUtil.format("更新配置失败，配置关键字：{}", oldConfig.getConfigKey()));
                }
            } else {
                configDTO.setConfigType(configTypeEnum);
                boolean res = this.save(BeanUtil.copyProperties(configDTO, Config.class));
                if (!res) {
                    throw new BizException(StrUtil.format("添加配置失败，配置关键字：{}", configDTO.getConfigKey()));
                }
            }
        }

        return true;
    }

    @Override
    public Wrapper<Config> buildWrapper(ConfigQueryDTO queryDTO){
        LambdaQueryWrapper<Config> wrapper = new LambdaQueryWrapper<>();

        wrapper.eq(queryDTO.getConfigType() != null,Config::getConfigType,queryDTO.getConfigType());
        wrapper.eq(!StrUtil.isEmpty(queryDTO.getConfigKey()),Config::getConfigKey,queryDTO.getConfigKey());

        return wrapper;
    }
}
